home *** CD-ROM | disk | FTP | other *** search
- PAGE ,132
- TITLE Floating point to ASCII Conversion
- IF1
- INCLUDE 87MAC.LIB
- ENDIF
- CODE SEGMENT PUBLIC
- ASSUME CS:CODE,DS:CODE,ES:CODE
- EXTRN TEN_TO_X:NEAR
- OLD_CW DW ?
- NEW_CW DW ?
- EXPONENT DW ?
- BCD_RESULT DT ?
- BCD_EXPONENT DT ?
- TEN8 DD 100000000
- PRINT_STRING DB ' . E ',13,10,'$'
- PUBLIC FLOAT_ASCII
- ;-----------------------------------------------;
- ; This routine takes the top element of the ;
- ; 8087 stack and displays the floating point ;
- ; value. ;
- ; Input -- ST0 of the 8087 ;
- ; Output -- Value is displayed, stack is popped ;
- ;-----------------------------------------------;
- FLOAT_ASCII PROC NEAR
- ;------ST0------;------ST1------;------ST2----
- ; X ; ;
- FLD ST0 ; X ; X ; ?
- FABS ; |X| ; X ;
- FLD1 ; 1 ; X ; X
- FXCH ST1 ; X ; 1 ; X
- FYL2X ; LOG2(X) ; X ; ?
- FLDL2T ; LOG2(10) ; LOG2(X) ; X
- FDIVRP ST1,ST0 ;E=LOGX/LOG10 ; X ; ?
- FNSTCW OLD_CW ; ; ;
- FWAIT ; ; ;
- MOV AX,OLD_CW ; ; ;
- AND AX, NOT 0C00H ; ; ;
- OR AX, 0400H ; ; ;
- MOV NEW_CW,AX ; ; ;
- FLDCW NEW_CW ; ; ;
- FRNDINT ; I= INT(E) ; X ; ?
- FLDCW OLD_CW ; ; ;
- FIST EXPONENT ; I ; X ; ?
- FCHS ; -I ; X ; ?
- CALL TEN_TO_X ; 10 **(-I) ; X ; ?
- FMULP ST1,ST0 ; X/10**I ; ? ; ?
- FIMUL TEN8 ; ADJUSTED FRAC ; ? ; ?
- FBSTP BCD_RESULT ; ? ; ? ; ?
- FILD EXPONENT ; I ; ? ; ?
- FBSTP BCD_EXPONENT ; ? ; ? ; ?
-
- ;----- Display the values stored as BCD strings
-
- CLD
- MOV DI,OFFSET PRINT_STRING ; Point at output string
- MOV AL,BYTE PTR BCD_RESULT+9
- CALL PRINT_SIGN ; Print the sign
- MOV AL,BYTE PTR BCD_RESULT+4
- CALL PRINT_NYBBLE ; Print the leading digit
- MOV AL,'.' ; The decimal point
- STOSB
- MOV BX,OFFSET BCD_RESULT+3
- MOV CX,4 ; Loop through the 8
- DO_BYTE: ; digits following
- CALL PRINT_BYTE ; the decimal point
- LOOP DO_BYTE
- MOV AL,'E' ; Exponent indicator
- STOSB
- MOV AL,BYTE PTR BCD_EXPONENT+9
- CALL PRINT_SIGN ; Print exponent sign
- MOV AL,BYTE PTR BCD_EXPONENT+1
- CALL PRINT_NYBBLE ; Print first digit
- MOV BX,OFFSET BCD_EXPONENT
- CALL PRINT_BYTE ; Last two digits of exp
- MOV DX,OFFSET PRINT_STRING
- MOV AH,9
- INT 21H ; Use DOS to print the string
- RET
- FLOAT_ASCII ENDP
-
- ;----- This routine prints a ' ' or '-'
-
- PRINT_SIGN PROC NEAR
- CMP AL,0 ; Test for minus sign
- MOV AL,' ' ; Positive
- JZ POSITIVE
- MOV AL,'-' ; Mark as negative
- POSITIVE:
- STOSB ; Put sign in the print string
- RET
- PRINT_SIGN ENDP
-
- ;------ This routine prints the two decimal
- ;------ digits pointed to by [BX]
-
- PRINT_BYTE PROC NEAR
- MOV AL,[BX] ; Get BCD byte
- PUSH CX
- MOV CL,4
- SHR AL,CL ; Shift high nybble to low portion
- POP CX
- CALL PRINT_NYBBLE ; Print high nybble
- MOV AL,[BX] ; Get original value back
- CALL PRINT_NYBBLE ; Print low nybble
- DEC BX ; Move to next byte in string
- RET
- PRINT_BYTE ENDP
-
- ;------ Print as decimal the AL value
-
- PRINT_NYBBLE PROC NEAR
- AND AL,0FH ; Isolate low nybble
- ADD AL,'0' ; Convert to ASCII value
- STOSB ; Store in print string
- RET
- PRINT_NYBBLE ENDP
- CODE ENDS
- END FLOAT_ASCII
-